package com.atguigu.dao;

import com.atguigu.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

public interface CustomerDao extends JpaRepository<Customer,Long> {

    // 查询所有
    // 默认使用jpql语句
    @Query(value = "from Customer")
    public List<Customer> findAllCustomer();

    // 按照客户名称模糊查询
    @Query(value = "from Customer where custName like ?")
    public List<Customer> findCustNameLike(String custName);


    // 按照客户名称模糊查询，同时按照客户所属行业匹配查询
    /**
     * 如果jpql语句中存在多个占位符?，那么方法的参数的顺序与问号顺序要匹配，如果不一致呢？
     * 如果不一致，使用?+数字的形式
     *   例如：
     *   ?1：表示第1个参数
     *   ?2：表示第2个参数
     *   ?3：表示第3个参数
     *
     */
    @Query(value = "from Customer where custName like ? and custIndustry = ?")
    public List<Customer> findCustNameLikeAndCustIndustry(String custName,String custIndustry);



    // 使用@Query完成更新,@Query默认表示查询，如果要执行增删改的操作，
    // 需要在@Query注解的下面添加：@Modifying
    /**
     * JPQL：update Customer set custAddress = "西部硅谷广场" where custId = 2
     */
    @Query(value = "update Customer set custAddress = ? where custId = ?")
    @Modifying
    public void updateCustomerCustAddress(String custAddress,Long custId);



    /**
     * @Query
    value ：jpql语句 | sql语句
    nativeQuery ：false（使用jpql查询--默认值） | true（使用本地查询：sql查询）
     */

    @Query(value = "select * from cst_customer",nativeQuery = true)
    List<Customer> findAllCustomerSQL();


    @Query(value = "select * from cst_customer where cust_name like ?",nativeQuery = true)
    List<Customer> findCustNameLikeSQL(String custName);

    @Query(value = "select * from cst_customer where cust_name like ? and cust_industry = ?",nativeQuery = true)
    List<Customer> findCustNameLikeAndCustIndustrySQL(String custName, String custIndustry);



    /**
     * pring data jpa的命名规则语法：
     *    findBy开头
     *        + 属性名称（首字母大写）  -- 默认Is
     *        + 查询的关键字（首字母大写）
     *            例如：Like
     *                  LessThan 小于等于
     *                  Between  介于…之间
     *                  Equal    等于
     *        + 连接多条件的关键字（首字母大写）
     *              例如：And
     *                    Or
     */
    // 客户名称查询
    public List<Customer> findByCustName(String custName);


    // 客户名称模糊
    public List<Customer> findByCustNameLike(String custName);

    // 客户名称模糊+客户的所属行业匹配（保证第1个参数就是方法命名的第一个字段）
    public List<Customer> findByCustNameLikeAndCustIndustry(String custName,String custIndustry);
}
